home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Games / flying-6.11 / vec3.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-30  |  2.4 KB  |  111 lines

  1. #ifndef _global_h
  2. #    include "global.h"
  3. #endif
  4.  
  5. #ifndef _vec3_h
  6. #    include "vec3.h"
  7. #endif
  8.  
  9. Vec3 Vec3Zero( RealZero, RealZero, RealZero );
  10.  
  11. #if (Vec3IsVector)
  12. Vec3::Vec3( const Real &l, const Real &b ) : Vector(3,0.0,0.0,0.0) {
  13. Real    hr = sin(b/180.0*M_PI);        // Radius am 'Breitengrad' b;
  14.  
  15.     data[0] = hr*cos(l/180.0*M_PI);
  16.     data[1] = hr*sin(l/180.0*M_PI);
  17.     data[2] = cos(b/180.0*M_PI);            // H÷he, bestimmt durch Breitengrad
  18. }
  19. #else
  20. Vec3::Vec3( const Real &l, const Real &b ) {
  21. Real    hr = sin(b/180.0*M_PI);        // Radius am 'Breitengrad' b;
  22.  
  23.     x_val = hr*cos(l/180.0*M_PI);
  24.     y_val = hr*sin(l/180.0*M_PI);
  25.     z_val = cos(b/180.0*M_PI);            // H÷he, bestimmt durch Breitengrad
  26.  
  27.     norm  = RealZero;
  28. }
  29. #endif
  30.  
  31. //
  32. // Berechnung des Winkels zwischen 2 Vec2en
  33. //
  34. Real Vec3::AngleRadTo( Vec3 &d )
  35. {
  36. Real    cos_phi = (*this)*d/(Norm()*d.Norm());
  37.  
  38.         return acos( cos_phi );
  39. }
  40.  
  41.  
  42. Real Vec3::AngleRad( const Real &dx, const Real &dy )
  43. {
  44. Real    erg;
  45.  
  46. #if (0)
  47. static FunTab    *TAN=0;
  48.     if (!TAN)            TAN = new FunTab( tan, -M_PI_2, M_PI_2, 64 );
  49. #endif
  50.  
  51.     if (dx)        erg = atan( dy/dx );
  52.     else                    erg = (dy>=RealZero)?M_PI_2:3*M_PI_2;
  53.     if (dx<RealZero)    erg+= M_PI;
  54.     if (erg<RealZero)    erg+= 2*M_PI;
  55.     return erg;
  56. }
  57.  
  58.  
  59. void Vec3::GetPolarRad( Real *l, Real *b ) const
  60. {
  61.     *l = AngleRad( X(), Y() );
  62.     *b = AngleRad( Z(), sqrt( X()*X() + Y()*Y() ) );
  63. }
  64. void Vec3::GetPolarRad( Real *l, Real *b, Real *r )
  65. {
  66.     *r = Norm();
  67.     GetPolarRad(l,b);
  68. }
  69.  
  70.  
  71.  
  72. Vec3 Vec3::XTurnAngleRad( const Real &angle ) const
  73. {
  74.     if (Y()!=RealZero||Z()!=RealZero) {
  75.             Real    len = sqrt( Y()*Y() + Z()*Z() );
  76.             Real    ang = AngleRad(Y(),Z()) + angle;
  77. #if (Vec3IsVector)
  78.             return Vec3( X(), len*cos(ang), len*sin(ang) );
  79. #else
  80.             return Vec3( X(), len*cos(ang), len*sin(ang), norm );
  81. #endif
  82.     }
  83.     else    return *this;
  84. }
  85. Vec3 Vec3::YTurnAngleRad( const Real &angle ) const
  86. {
  87.     if (X()!=RealZero||Z()!=RealZero) {
  88.             Real    len = sqrt( X()*X() + Z()*Z() );
  89.             Real    ang = AngleRad(X(),Z()) + angle;
  90. #if (Vec3IsVector)
  91.             return Vec3( len*cos(ang), Y(), len*sin(ang) );
  92. #else
  93.             return Vec3( len*cos(ang), Y(), len*sin(ang), norm );
  94. #endif
  95.     }
  96.     else    return *this;
  97. }
  98. Vec3 Vec3::ZTurnAngleRad( const Real &angle ) const
  99. {
  100.     if (X()!=RealZero||Y()!=RealZero) {
  101.             Real    len = sqrt( X()*X() + Y()*Y() );
  102.             Real    ang = AngleRad(X(),Y()) + angle;
  103. #if (Vec3IsVector)
  104.             return Vec3( len*cos(ang), len*sin(ang), Z() );
  105. #else
  106.             return Vec3( len*cos(ang), len*sin(ang), Z(), norm );
  107. #endif
  108.     }
  109.     else    return *this;
  110. }
  111.